package leecode;

/**
 * 第七天
 */
public class LeetCode6 {
    //第一题   树的子结构
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        //对每个节点进行遍历，并且传入recur1进行判断
        return (A!= null&&B!= null)&&recur1(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
    }
    private boolean recur1(TreeNode A,TreeNode B){
        //如果把B遍历完了就是有了
        if(B==null){
            return true;
        }
        //当把A都遍历完了还没有就是false
        if(A==null||A.val!=B.val){
            return false;
        }
        //对A，B，的左右节点进行判断
        return recur(A.right,B.right)&&recur(A.left,B.left);
    }
    //第二题
    public TreeNode mirrorTree(TreeNode root) {
        if(root==null){
            return null;
        }
        //进行树的交换
        TreeNode tmp=root.left;
        root.left= root.right;
        root.right=tmp;
        //进行递归
        mirrorTree(root.left);
        mirrorTree(root.right);
        return root;
    }
    //第三题
    public boolean isSymmetric(TreeNode root) {
    if(root==null) {
        return true;
    }
    return recur(root.left,root.right);
    }
    public boolean recur(TreeNode root1,TreeNode root2){
        //如果当两个同时为空，就说明两个同时玩，并且没有触发判断false的条件
        if(root1==null&&root2==null){
            return true;
        }
        //进行排除判断，如果一个先玩 另一个后完，就不对称，两个值不一样也是
        if(root1==null||root2==null||root1.val!=root2.val){
            return false;
        }
        //进行匹配，左树的左要和右树的右相对
        return recur(root1.left,root2.right)&&recur(root1.right,root2.left);
    }

}
